import { requestObj } from '@/config/ai.js';
import { getWebsocketUrl } from '@/utils/webscoket.js';
import bus from '@/utils/eventBus.js'

export default class ModelLoader {
  constructor() {
    this.historyMessage = []
    this.result = ''
    this.init()
  }

  init() {
    this.historyMessage = [{ role: 'user', content: '你是谁' }, { role: 'assistant', content: '我是AI助手' }]
    bus.emit("init-hoodle", this.historyMessage)
    this.result = ''
  }

  setHistoryMessage(historyMessage) {
    this.historyMessage = historyMessage
  }

  async sendMsg(questionText) {
    this.result = ' ';
    // 获取请求地址
    let myUrl = await getWebsocketUrl();
    // 获取输入框中的内容
    // 每次发送问题 都是一个新的websocket请求
    let socket = new WebSocket(myUrl);

    // 监听websocket的各阶段事件 并做相应处理
    socket.addEventListener('open', (event) => {
      bus.emit("load-hoodle", true)
      // 发送消息
      let params = {
        header: {
          app_id: requestObj.APPID,
        },
        parameter: {
          chat: {
            domain: requestObj.DoMain,
            temperature: 0.5,
            max_tokens: 512
          }
        },
        payload: {
          message: {
            // 如果想获取结合上下文的回答，需要开发者每次将历史问答信息一起传给服务端，如下示例
            // 注意：text里面的所有content内容加一起的tokens需要控制在8192以内，开发者如有较长对话需求，需要适当裁剪历史信息
            text: [
              ...this.historyMessage,
              // ....... 省略的历史对话
              { role: 'user', content: questionText } //# 最新的一条问题，如无需上下文，可只传最新一条问题
            ]
          }
        }
      };
      socket.send(JSON.stringify(params));
    });
    socket.addEventListener('message', (event) => {
      let data = JSON.parse(event.data);
      if (!data.payload) {
        socket.close();
        return;
      }
      this.result += data.payload.choices.text[0].content;
      // respondHoodle(this.result);
      bus.emit("respond-hoodle", this.result)

      if (data.header.code !== 0) {
        console.log('出错了', data.header.code, ':', data.header.message);
        // 出错了"手动关闭连接"
        socket.close();
      }
      if (data.header.code === 0) {
        // 对话已经完成
        if (data.payload.choices.text && data.header.status === 2) {
          setTimeout(() => {
            // "对话完成，手动关闭连接"
            socket.close();
          }, 1000);
        }
      }
    });
    socket.addEventListener('close', (event) => {
      this.setHistoryMessage([
        ...this.historyMessage,
        { role: 'user', content: questionText },
        { role: 'assistant', content: this.result }
      ]);
      bus.emit("load-hoodle", false)
      // 对话完成后socket会关闭，将聊天记录换行处理
    });
    socket.addEventListener('error', (event) => {
      bus.emit("error-hoodle", true)
      console.log('连接发送错误！！', event);
    });
  }
}